package cn.site.modules.sys.web;

import cn.site.core.utils.IdGen;
import cn.site.core.utils.StringUtils;
import cn.site.core.web.BaseController;
import cn.site.modules.sys.entity.User;
import cn.site.modules.sys.service.SystemService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;

import java.util.List;

/**
 * Created by ZGJ on 2015/3/8.
 */
@Controller
@RequestMapping(value = "/sys/user")
public class UserController extends BaseController{

    @Autowired
    private SystemService systemService;


    /**
     * Struts2 有一个很实用的Preparable二次绑定功能
     * 表单提交时，先绑定一个ID，使用这个ID从数据库里找出对象来
     * 再把表单中的其他属性绑定到这个对象上
     * 对于表单中输入框数量比领域对象的属性数少的情况很实用。
     *
     *
     * 先用@ModelAttribute标注如下函数。
     * SpringMVC会在执行任何实际处理函数之前，执行该函数添加model attribute[参考下面的get方法]
     *
     * 再在update函数里，以@ModelAttribute标注表单处理函数的参数。
     * SpringMVC就会按名称"user"取出前面的对象，然后才进行真正的Binding。[参考下面的form方法]
     *
     * 这里有个小坑爹的地方是，这个getUser()会在controller的所有函数前都执行，
     * 因此需要进行一下判断RequestParam中是否含id属性的判断，
     * 要不你就把update()方法独立到一个Controller中。
     * 另外，你也可以选择不用这个功能，而是自己创建一个Form的DTO，然后用Dozer或手工把属性绑定到领域对象上。
     *
     * @return
     */
    @ModelAttribute
    public User get(@RequestParam(required = false) String id){
        if (StringUtils.isNotBlank(id)){
            return systemService.getUser(id);
        }else{
            return new User();
        }
    }

    /**
     * 获取用户列表
     * @param model
     * @return
     */
    @RequestMapping(value = {"list", ""})
    public String list(Model model){
        List<User> list = systemService.findUser();
        model.addAttribute("list", list);

        return "modules/sys/userList";
    }

    @RequestMapping(value = "form")
    public String form(User user, Model model) {
        model.addAttribute("user", user);
        //model.addAttribute("allRoles", systemService.findAllRole());
        return "modules/sys/userForm";
    }

    /**
     *
     * 为了防止用户刷新重复提交，save操作之后一般会redirect到另一个页面，同时带点操作成功的提示信息。
     * 为是Redirect，Request里的attribute不会传递过去，如果放在session中，则需要在显示后及时清理，不然下面每一页都带着这个信息也不对。
     * 留意下面方法里redirectAttributes的使用
     * @return
     */
    @RequestMapping(value = "save")
    public String save(User user, String oldLoginName, String newPassword, Model model, RedirectAttributes redirectAttributes){

        user.setId(IdGen.uuid());

        // 如果新密码为空，则不更换密码
        if (StringUtils.isNotBlank(newPassword)) {
            user.setPassword(SystemService.entryptPassword(newPassword));
            //user.setPassword(newPassword);
        }

        //jsr303(hibernate validation)验证
        if (!beanValidator(model, user)){
            return form(user, model);
        }

        /*if (!"true".equals(checkLoginName(oldLoginName, user.getLoginName()))){
            addMessage(model, "保存用户'" + user.getLoginName() + "'失败，登录名已存在");
            return form(user, model);
        }*/

        systemService.saveUser(user);

        // 清除当前用户缓存
        /*if (user.getLoginName().equals(UserUtils.getUser().getLoginName())){
            UserUtils.getCacheMap().clear();
        }*/

        addMessage(redirectAttributes, "保存用户'" + user.getLoginName() + "'成功");

        return "redirect:/sys/user";
    }

}
